home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1997 December / EnigmA AMIGA RUN 23 (1997)(G.R. Edizioni)(IT)[!][issue 1997-12][EAR-CD VII].iso / listati / codice_decompressione.c next >
C/C++ Source or Header  |  1997-11-11  |  3KB  |  96 lines

  1. //**********************************************************************
  2. //*                                                                    *
  3. //*      Algoritmo per la decodifica di immagini IFF-ILBM              *
  4. //*                                                                    *
  5. //***********************************************************************
  6.  
  7. Per motivi di spazio presentiamo solo la paret centrale dell'algoritmo.
  8. Il resto del listato, adeguatamente commentato è nel CD-ROM.
  9.  
  10. struct chunk {
  11.        ULONG id;
  12.        ULONG dimens;
  13.        UBYTE *buffer;
  14.   };// CMAP CAMG e BODY hanno praticamente la stessa struttura
  15.  
  16. struct chunk_bmhd {
  17.    ULONG id;
  18.        ULONG dimens;
  19.        UWORD lx_immagine;
  20.        UWORD ly_immagine;
  21.        UWORD x_bitmap;
  22.        UWORD y_bitmap;
  23.        UBYTE piani;
  24.        UBYTE decodifica;
  25.        UBYTE compressione;
  26.        UWORD colore_trasparente;
  27.        UBYTE x_aspetto_pixel;
  28.        UBYTE y_aspetto_pixel;
  29.        UWORD lx_schermo;
  30.        UWORD ly_schermo;
  31.   };
  32.  
  33. struct chunk       *cmap=NULL,
  34.                    *camg=NULL,
  35.                    *body=NULL;
  36. struct chunk_bmhd  bmhd; //BMHD ha grandezza fissa
  37. struct BitMap      immagine;
  38. ULONG  riga=0, bytes_per_riga=0, i, cicli=0;
  39. UBYTE  *indirizzo  =NULL;
  40. UBYTE  *appo       =NULL;
  41.  
  42. programma...
  43.  
  44.     // Decompressione IFF
  45.  
  46.     while(!bmhd.lx_immagine % 16) bmhd.lx_immagine++;
  47.     //
  48.     //l'ampiezza dell'immahine in pixel è ora multipla di 16.
  49.     //
  50.     bytes_per_riga=bmhd.lx_immagine/8;
  51.     appo=body->buffer;
  52.     //
  53.     // appo punta ai dati da decomprimere;
  54.     //
  55.     for (riga=0;riga<bmhd.ly_immagine;riga++)
  56.     { for(num_piano=0;num_piano<bmhd.piani;num_piano++)
  57.        { indirizzo=immagine.Planes[num_piano]+(bytes_per_riga*riga);
  58.            //
  59.            //immagine.Planes[num_piano] è il puntatore ad uno dei
  60.            //bitplane dell'immagine
  61.            //
  62.            if (bmhd.compressione==1)
  63.            { numero_bytes=0;
  64.              while (numero_bytes<bytes_per_riga)
  65.              { cicli=UBYTE(*(appo++));
  66.                if ((cicli)>127)
  67.                { //
  68.                  // l'immagine è risultata compressa.
  69.                  //
  70.                  cicli=(-cicli)+1;
  71.                  for(i=0;i<cicli;i++,numero_bytes++,indirizzo++) *indirizzo=*appo;
  72.                  appo++;
  73.                }
  74.                else
  75.                { //
  76.                  // I seguenti bytes non sono compressi.Trasferiamoli
  77.                  // nel bitplane.
  78.                  //
  79.                  for(i=0;i<=cicli;i++,numero_bytes++) *(indirizzo++)=*(appo++);
  80.                }
  81.              }
  82.            }
  83.            else for(i=0;i<bytes_per_riga;i++) *(indirizzo++)=*(appo++);
  84.            // l' immagine non è compressa
  85.        }
  86.     }
  87.  
  88.  
  89.  
  90.  
  91.  
  92.  
  93.  
  94.  
  95.  
  96.